package io.lvdaxian.mybatis07.reflection.property;

import java.util.Locale;

/**
 * 这是一个 属性命名器 类
 *
 * @author lihh
 */
public class PropertyNamer {
  
  // 构造方法私有化，防止通过 new 拿到实例
  private PropertyNamer() {
  }
  
  /**
   * 将 方法 转换为 属性
   *
   * @param name 方法名称
   * @return 返回修改后的属性
   * @author lihh
   */
  public static String methodToProperty(String name) {
    // 通过 一系列的判断，拿到标准的名称
    if (name.startsWith("is")) {
      name = name.substring(2);
    } else if (name.startsWith("get") || name.startsWith("set")) {
      name = name.substring(3);
    } else {
      throw new RuntimeException("Error parsing property name '" + name + "'.  Didn't start with 'is', 'get' or 'set'.");
    }
    
    /*
     * 如果只有1个字母，转换为小写
     * 如果大于1个字母，第二个字母非大写，转换为小写
     * todo 这里为啥不 一起转换呢，防止修改原有的驼峰命名
     */
    if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) {
      name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);
    }
    
    return name;
  }
  
  /**
   * 是否为标准的 setter getter方法
   *
   * @param name 方法名称
   * @return 返回状态
   * @author lihh
   */
  public static boolean isProperty(String name) {
    return isGetter(name) || isSetter(name);
  }
  
  /**
   * 判断 是否为 getter方法
   *
   * @param name 方法名称
   * @return 返回状态，是否为准备的 getter 方法
   * @author lihh
   */
  public static boolean isGetter(String name) {
    return name.startsWith("get") || name.startsWith("is");
  }
  
  /**
   * 判断 是否为 setter 方法
   *
   * @param name 这里传递的方法名称
   * @return 返回状态
   * @author lihh
   */
  public static boolean isSetter(String name) {
    return name.startsWith("set");
  }
}
